﻿#ifndef SQLITEDB_H_
#define SQLITEDB_H_

#include <QtCore/qglobal.h>


#if defined(SQLITEDB_LIBRARY)
#  define SQLITEDBSHARED_EXPORT Q_DECL_EXPORT

#else
#  define SQLITEDBSHARED_EXPORT Q_DECL_IMPORT

#endif



#pragma pack(1)

typedef struct _Field_Info
{
	unsigned int	columnId;
	unsigned char	fieldType;		
	unsigned short  fieldLength;					//长度
	_Field_Info()
	{
		columnId = 0;
		fieldType = 0;
		fieldLength = 0;
	}
	~_Field_Info()
	{
	}
}Field_Info;


#pragma pack()

class SqlInterface;

class SQLITEDBSHARED_EXPORT SqLiteDB
{
public:
    SqLiteDB();
    ~SqLiteDB();

public:

    int		Init_DB(bool bExportDBFlag=false,char *DbNameBuff=NULL, int bufflen=0);
	
	int		SetNewDBName(char *DbNameBuff, int bufflen);

/*	函数：	Fini_DB
    用途：	数据库接口DLL释放
    输入：
    返回：	*/
    int		Fini_DB();

/*	函数：	IsCurDBConnected
    用途：  当前数据库是否连接
    输入：
    返回：	*/
    int		IsCurDBConnected(bool &bConnected, bool bAutoReconnect = false);

/*  函数:   DB_Select
    用途:   数据查询(双数据源配置下，如果bspecify_db==true：指定数据库未连接，则直接返回错误，不从另一库中返回结果；
			如果bspecify_db==false： 则指定数据库未连接，从另一库中返回结果。)
    输入:   select_string,result_buffer,buffer_length
    返回:   错误编码*/
//	int    DB_Select(char* select_string, char *&result_buffer, int *buffer_length);
	int    DB_Select(Field_Info *pFieldInfo, int FieldNum, char* select_string, char *&result_buffer, int *buffer_length);

	int    DB_SelectUByte(char* select_string, char *&result_buffer, int *buffer_length);
	int    DB_SelectUShort(char* select_string, char *&result_buffer, int *buffer_length);
	int    DB_SelectUInt(char* select_string, char *&result_buffer, int *buffer_length);
	int    DB_SelectFloat(char* select_string, char *&result_buffer, int *buffer_length);
	int    DB_SelectDouble(char* select_string, char *&result_buffer, int *buffer_length);
	int    DB_SelectString(int DataLen, char* select_string, char *&result_buffer, int *buffer_length);

	int    DB_SelectByTableId(unsigned int AppType,unsigned int TableId, char* select_string, char *&result_buffer, int *buffer_length);
	
	int    GetTableFieldInfo(unsigned int AppType,unsigned int TableId, Field_Info *&pFieldInfo, int *FieldNum);

/*  函数:   DB_Modify
	用途:   数据更改操作
			(双数据源配置下，如果bspecify_db==true：则只写指定库，如果指定库未连接，则直接返回错误；
			如果bspecify_db==false bwrite_bak_db==true： 则将指定库写完后，再写备用库。如果指定数据库未连接，直接返回错误; 指定库写完毕，备用库写失败，返回错误。)
    输入:   modify_string,cur_db_val,bwrite_err_table
    返回:   错误编码*/
    int    DB_Modify(char* modify_string);

/*  函数:   OpenCurDB
    用途:   打开数据库
    输入:
    返回:   错误编码*/
    int		OpenCurDB();

/*  函数:   CloseCurDB
    用途:   关闭数据库
    输入:
    返回:   错误编码*/
    int		CloseCurDB();

/*  函数:   GetLastSqlErrNo
    用途:   获取指定库的最近操作的MySql错误代码
    输入:
    返回:   错误编码*/
    int		GetLastSqlErrNo(unsigned int &SqlErr_Net_Zero);
	
	int		BeginTransaction();
	int		CommitTransaction();
protected:
    int		GetColumnInfoForBinaryTable(unsigned int tableId, unsigned int appType);
	

private:
    unsigned int	m_SqlErrNo;
	char			m_SqlBuff[3072];
	bool			m_bExportDBFlag;
	SqlInterface	*m_pSqlMgr;
};

#endif // NSA3000TDB_H
